home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0036_Uart Detection.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  2KB  |  71 lines

  1. {
  2.  > I'm looking for a small pascal V6 program to detect
  3.  > the UART-type installed.
  4.  
  5.    Sure. How small do you need it? Here's one that'll compile to something just
  6. below 3kb, will that do?
  7.  }
  8.  
  9. function UART(Port: word): word; assembler;
  10. { Checks for UART, and, if one is present, what type.         }
  11. { Returns  0 if no UART,  1 if UART but no 16550,  2 if 16550 }
  12. { Donated to the public domain by Björn Felten @ 2:203/208    }
  13. { Partly from an asm program by Anders Danielsson @ 2:203/101 }
  14. asm
  15.    mov  cx,Port          {1..4}
  16.    push ds
  17.    mov  ds,seg0040       {Use BIOS table to find port addr}
  18.    xor  si,si            {Offset 0 in BIOS table segment}
  19.    rep  lodsw            {Get the right one}
  20.    pop  ds
  21.    or   ax,ax            {Test port address}
  22.    jz   @no_uart         {If zero --> no port}
  23.    mov  dx,ax            {Base address}
  24.    add  dx,4             {Base+4}
  25.    cli
  26.    in   al,dx            {Modem Control Register}
  27.    and  al,11100000b     {Check bit 5-7}
  28.    jnz  @no_uart         {Non-zero --> no UART}
  29.    sub  dx,2             {Base+2}
  30.    jmp  @1               {Give hardware some time}
  31. @1:
  32.    in   al,dx            {Interrupt Identification Register}
  33.    and  al,11110000b     {Check bit 4-7}
  34.    cmp  al,11000000b     {FIFO enabled?}
  35.    jz   @is16550         {Yes, it is a 16550}
  36.    and  al,00110000b     {Check reserved bits}
  37.    jnz  @no_uart         {Non-zero --> No UART}
  38.    mov  al,00000111b     {16550 FIFO enable}
  39.    out  dx,al            {FIFO control register}
  40.    jmp  @2
  41. @2:
  42.    in   al,dx            {FIFO control register}
  43.    and  al,11110000b     {Check bit 4-7}
  44.    mov  ah,al            {Save for later}
  45.    jmp  @3
  46. @3:
  47.    mov  al,00000110b     {16550 FIFO disable}
  48.    out  dx,al            {FIFO control register}
  49.    cmp  ah,11000000b     {FIFO still not enabled?}
  50.    jz   @is16550         {Yes, it is a 16550}
  51.    mov  ax,1
  52.    jmp  @quit
  53. @is16550:
  54.    mov  ax,2
  55.    jmp  @quit
  56. @no_uart:
  57.    xor  ax,ax
  58. @quit:
  59.    sti
  60. end;
  61.  
  62. var P: word;
  63. begin
  64.   for P:=1 to 4 do
  65.   case UART(P) of
  66.     0: writeln('No UART on port COM',P);
  67.     1: writeln('UART, but not 16550, on port COM',P);
  68.     2: writeln('16550 UART on port COM',P);
  69.   end
  70. end.
  71.